﻿/**
 * Create in 2012-3-29 下午9:01:00.
 */
package kit4j.common.image;

import java.awt.Point;
import java.util.ArrayList;
import java.util.List;

/**
 * 连接线类型，该类型定义了一系列连接的线段的组合。如果该连接线的{@link #getFirstPoint() firstPoint}与
 * {@link #getLastPoint() lastPoint}处在同一坐标点，则这一系列连接线组成的图形是闭合的。
 * 
 * @author MiniKnife
 * 
 */
public class Polyline {

	/**
	 * 该连接线包含的点的列表。
	 */
	private List<Point> pointList;

	/**
	 * 创建一个不包含任何线段的连接线对象。
	 */
	public Polyline() {
		pointList = new ArrayList<Point>();
	}

	/**
	 * 创建由x和y坐标数组定义的一系列连接线。
	 * @param xPoints x坐标数组
	 * @param yPoints y坐标数组
	 * @param nPoints 点的总数
	 */
	public Polyline(int[] xPoints, int[] yPoints, int nPoints) {
		this();

		for (int i = 0; i < nPoints; ++i) {
			pointList.add(new Point(xPoints[i], yPoints[i]));
		}
	}

	/**
	 * 创建由Point数组定义的一系列连接线。
	 * @param points Point对象数组
	 */
	public Polyline(Point... points) {
		this();

		for (Point p : points) {
			pointList.add(p);
		}
	}

	/**
	 * 添加一个点到该连接线对象的最后。
	 * @param point 要添加的点
	 */
	public void add(Point point) {
		pointList.add(point);
	}

	/**
	 * 在连接线中指定的点的顺序位置插入一个点。
	 * @param index 要插入的点的顺序位置
	 * @param point 要插入的点
	 */
	public void add(int index, Point point) {
		pointList.add(index, point);
	}

	/**
	 * 添加一系列的点到该连接线对象的最后。
	 * @param points 要添加的点
	 */
	public void addAll(Point... points) {
		for (Point p : points) {
			pointList.add(p);
		}
	}

	/**
	 * 在连接线中指定的点的顺序位置插入一系列的点。
	 * @param points 要插入的点的数组
	 * @param fromIndex 要插入的点的起始顺序位置
	 * @param nPoints 点的总数
	 */
	public void addAll(Point[] points, int fromIndex, int nPoints) {
		for (int i = 0; i < nPoints; ++i) {
			pointList.add(i + fromIndex, points[i]);
		}
	}

	/**
	 * @return 该连接线对象的起始点
	 */
	public Point getFirstPoint() {
		return pointList.get(0);
	}

	/**
	 * @return 该连接线对象的终点
	 */
	public Point getLastPoint() {
		return pointList.get(pointList.size() - 1);
	}

	/**
	 * @return 该连接线对象包含的点的数组
	 */
	public Point[] getPoints() {
		return pointList.toArray(new Point[0]);
	}

	/**
	 * @return 该连接线对象包含的点的x坐标数组
	 */
	public int[] getXPoints() {
		int size = pointCount();
		int[] xPoints = new int[size];

		for (int i = 0; i < size; ++i) {
			xPoints[i] = pointList.get(i).x;
		}

		return xPoints;
	}

	/**
	 * @return 该连接线对象包含的点的x坐标数组
	 */
	public int[] getYPoints() {
		int size = pointCount();
		int[] yPoints = new int[size];

		for (int i = 0; i < size; ++i) {
			yPoints[i] = pointList.get(i).y;
		}

		return yPoints;
	}

	/**
	 * @return 该连接线对象包含的点的总数
	 */
	public int pointCount() {
		return pointList.size();
	}

	/**
	 * 判断该连接线中是否包含指定的点。
	 * @param point 要判断的点
	 * @return 如果包含指定的点，返回true，否则返回false。
	 */
	public boolean contains(Point point) {
		return pointList.contains(point);
	}

	/**
	 * 判断该连接线中是否包含指定的一系列点。
	 * @param points 要判断的点
	 * @return 如果包含指定的所有的点，返回true，否则返回false。
	 */
	public boolean containsAll(Point... points) {
		for (Point p : points) {
			if (!pointList.contains(p)) {
				return false;
			}
		}

		return true;
	}
	
	//待实现方法：判断该连接线是否穿过指定的点；判断该连接线组成的图形是否是闭合的；如果该连接线是闭合的，判断指定的点是否在其组成的图形的边界内。

}
